//题目:
// 给定一个整数数组 arr ，返回 arr 的 最大湍流子数组的长度 。
// 如果比较符号在子数组中的每个相邻元素对之间翻转，则该子数组是 湍流子数组 。
// 更正式地来说，当 arr 的子数组 A[i], A[i+1], ..., A[j] 满足仅满足下列条件时，我们称其为湍流子数组：
// 若 i <= k < j ：
// 当 k 为奇数时， A[k] > A[k+1]，且
// 当 k 为偶数时，A[k] < A[k+1]；
// 或 若 i <= k < j ：
// 当 k 为偶数时，A[k] > A[k+1] ，且
// 当 k 为奇数时， A[k] < A[k+1]。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int maxTurbulenceSize(vector<int>& arr) 
    {
        if(arr.size()<=1) return arr.size();
        if(arr.size()==2 && arr[0]==arr[1]) return 1;
        if(arr.size()==2 && arr[0]!=arr[1]) return 2;
        //1.创建dp表————dp[i]表示以arr[i]为结尾的最长湍流子数组
        vector<int> dp(arr.size());
        //2.初始化
        dp[0]=1;
        dp[1]=arr[0]==arr[1]?1:2;
        //3.填表————动态转移方程：if(dp[i-1]!=0 && (nums[i-2]<nums[i-1] && nums[i-1]>nums[i]) || (nums[i-2]>nums[i-1] && nums[i-1]<nums[i]))
        for(int i=2;i<arr.size();i++)
        {
            if((arr[i-2]<arr[i-1] && arr[i-1]>arr[i]) || (arr[i-2]>arr[i-1] && arr[i-1]<arr[i]))
            {
                if(dp[i-1]==0) dp[i]=3;
                else dp[i]=dp[i-1]+1;
            }
            else 
            {
                dp[i]=arr[i]==arr[i-1]?1:2;
            }
        }   
        //4.确定返回值
        int ret=0;
        for(int i=0;i<arr.size();i++)
            ret=max(ret,dp[i]);
        return ret;
    }
};